Software applications are often large and complex, developed over time by multiple developers or teams of developers. Additionally, software applications are often modified to add/remove features, fix bugs, etc. As a software application is built (or modified) over time, new software components and modules are often added as new functionality is added. In some cases, these modules are dynamically invoked only at runtime, and/or based on select features enabled for certain users.
As the application evolves in this manner, some software components may no longer be accessed by the software application, but still remain as part of the application. These unused or “obsolete” components make the application bulkier and slower to boot, consuming both memory and processor resources. Similarly, various portions of the software delivery pipeline and the application runtime slow down as the number of modules increase.
However, even though the application does not need a particular software module, it is often difficult for conventional systems to identify which modules are obsolete and could be eliminated. Simply removing modules that a developer may suspect are not used can cause wide-ranging application failures and other negative ramifications to users of the application if the modules turn out to be used (if only very little). Embodiments of the present disclosure address these and other issues by providing a deterministic way to identify such unused modules